﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CCL.TableStructure;

namespace CCL.SocketMessage.Response
{
    /// <summary>
    /// 로그데이터 요청에 대한 응답을 제공합니다.
    /// </summary>
    public class ShowLog : ResponseBody
    {
        /// <summary>
        /// 로그데이터 리스트를 가져옵니다.
        /// </summary>
        public List<ProjectRevision> RevisionDataList { get; private set; }
        
        /// <summary>
        /// 성공한 응답을 생성합니다.
        /// </summary>
        public ShowLog()
            : base()
        {
            RevisionDataList = new List<ProjectRevision>();
        }

        /// <summary>
        /// 실패한 응답을 생성합니다.
        /// </summary>
        /// <param name="errorMessage"></param>
        public ShowLog(string errorMessage)
            : base(errorMessage)
        {

        }

        /// <summary>
        /// 직렬화된 바이트배열을 통해 생성합니다.
        /// </summary>
        /// <param name="bytes"></param>
        public ShowLog(byte[] bytes)
            :base(bytes)
        {
            if (Result == Constant.Result.Success)
            {
                int start = 1;
                RevisionDataList = new List<ProjectRevision>();

                int tableSize = ProjectRevision.TableSize;

                for (; start < bytes.Length; start += tableSize)
                {
                    byte[] tableBytes = new byte[tableSize];
                    Array.Copy(bytes, start, tableBytes, 0, tableSize);
                    ProjectRevision table = new ProjectRevision(tableBytes);
                    RevisionDataList.Add(table);
                }
            }
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] baseBytes = base.GetByte();

            if (Result == Constant.Result.Success)
            {
                foreach (ProjectRevision table in RevisionDataList)
                {
                    int start = 1;
                    byte[] tableBytes = table.GetByte();

                    Array.Copy(tableBytes, 0, baseBytes, start, TableStructure.ProjectMember.TableSize);
                    start += tableBytes.Length;
                }
            }

            return baseBytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            uint size = base.GetSize();

            if (Result == Constant.Result.Success)
            {
                size += (uint)(ProjectRevision.TableSize * RevisionDataList.Count);
            }

            return size;
        }
    }
}
